Skip to main content

Reporte sobre Lip Sync con Three.js Fiber

Introducción

Este documento presenta una investigación sobre la implementación de lip sync en aplicaciones desarrolladas con Three.js y React Three Fiber. Se abordan herramientas como ElevenLabs, Rhubarb Lip Sync y Lyisinc, así como las ventajas de utilizar Three.js Fiber para mejorar el rendimiento y la calidad de las animaciones.

Ventajas de Three.js Fiber

Three.js Fiber ofrece una manera eficiente de desarrollar aplicaciones en 3D dentro del ecosistema de React. Sus principales ventajas incluyen:

  • Rendimiento optimizado: Gracias al uso de reconciliación con React, permite manejar escenas complejas sin afectar el rendimiento.
  • Simplicidad: Proporciona una API declarativa más intuitiva para manejar gráficos en 3D.
  • Soporte para animaciones y estilos: Facilita la integración de animaciones, estilos y modelos importados.

Generación de modelos y animaciones

Los modelos 3D utilizados en Three.js Fiber pueden ser generados con la herramienta gltfjsx. Un ejemplo de generación de modelo sería:

npx gltfjsx public/models/abraham.glb -o src/components/Abraham.jsx -r public

Este comando genera un componente React con el modelo 3D listo para ser utilizado en una escena.

Código de animación en Three.js Fiber

A continuación, un ejemplo de código en React con Three.js Fiber para animar un modelo:

import React, { useEffect, useRef, useState } from "react";
import { useGraph } from "@react-three/fiber";
import { useAnimations, useFBX, useGLTF } from "@react-three/drei";
import { SkeletonUtils } from "three-stdlib";

export function Abraham(props) {
const { scene } = useGLTF("/models/abraham.glb");
const clone = React.useMemo(() => SkeletonUtils.clone(scene), [scene]);
const { nodes, materials } = useGraph(clone);

const { animations: happyAnimation } = useFBX("/models/happy.fbx");
const { animations: idleAnimation } = useFBX("/models/idle.fbx");

idleAnimation[0].name = "Idle";
happyAnimation[0].name = "happy";

const [animation, setAnimation] = useState("happy");
const group = useRef();
const { actions } = useAnimations([
idleAnimation[0], happyAnimation[0]
], group);

useEffect(() => {
actions[animation].reset().fadeIn(0.5).play();
return () => actions[animation].fadeOut(0.5).play();
});

return (
<group {...props} dispose={null} ref={group}>
<primitive object={nodes.Hips} />
</group>
);
}
useGLTF.preload("/models/abraham.glb");

ElevenLabs

Introducción

ElevenLabs es una herramienta de síntesis de voz basada en inteligencia artificial que permite convertir texto en audio y viceversa. Su tecnología avanzada interpreta el contexto del texto para generar una entonación natural en la voz.

Funcionalidades principales

  • Síntesis de voz: Transforma texto en audio con diferentes configuraciones de voz.
  • Selección de voz: Permite elegir entre distintos acentos, tonos y estilos.
  • Conversión de audio a texto: Utiliza inteligencia artificial para transcribir audios.
  • API disponible: Permite integrar la herramienta en aplicaciones externas.
  • Personalización avanzada: Ajustes de estabilidad, similitud y estilo de voz.

Configuraciones avanzadas

Stability (Estabilidad)

  • Determina la consistencia en la generación de la voz.
  • Un valor bajo introduce mayor variabilidad emocional.
  • Un valor alto hace la voz más monótona y consistente.
  • Recomendación: Estabilidad en 50 para un balance entre emoción y claridad.

Similarity (Similitud)

  • Dicta qué tan fiel debe ser la voz generada respecto a la original.
  • Un valor alto puede replicar ruidos o artefactos de un audio de baja calidad.

Style Exaggeration (Exageración de estilo)

  • Amplifica el estilo del hablante original.
  • Aumenta la carga computacional y puede reducir la estabilidad.
  • Recomendación: Mantener en 0 para evitar fluctuaciones indeseadas.

Speaker Boost

  • Aumenta la similitud con el hablante original.
  • Incrementa la carga computacional y puede generar latencia.

Uso de la API

ElevenLabs permite insertar pausas en el audio generado utilizando la siguiente sintaxis:

<break time="1.5s"/>

Este comando introduce una pausa de 1.5 segundos para hacer que el audio sea más natural.

Planes y Precios

Plan Starter - $5/mes

  • 30,000 créditos (~30 min de audio)
  • Clonación de voz con solo 1 minuto de audio
  • Acceso al editor de doblaje
  • Licencia para uso comercial

Plan Creator - $22/mes

  • Todo lo del plan Starter
  • Clonación de voz profesional para una réplica más realista
  • Studio para contenido de larga duración con múltiples hablantes
  • Audio Native para narraciones en sitios web y blogs
  • Calidad de audio mejorada en API (192 kbps)

Conclusión

ElevenLabs es una solución avanzada para la síntesis de voz, ofreciendo una amplia gama de configuraciones que permiten personalizar la experiencia de generación de audio. Su API flexible y opciones de ajuste hacen que sea ideal para aplicaciones interactivas, narraciones y doblajes automatizados.

Resumen sobre Rhubarb Lip Sync

Introducción

Rhubarb Lip Sync es una herramienta que permite generar animaciones 2D de sincronización labial a partir de grabaciones de voz. Analiza archivos de audio, reconoce el contenido hablado y genera automáticamente la información necesaria para la animación de los labios. Se usa comúnmente en videojuegos, animaciones y otros proyectos interactivos.

Más información: Repositorio en GitHub

Formatos de entrada

Rhubarb Lip Sync admite los siguientes formatos de audio:

  • WAVE (.wav)
  • Ogg Vorbis (.ogg)

El archivo de audio debe ser el último argumento en la línea de comandos al ejecutar el programa.

Explicación del Archivo JSON de Salida

El archivo JSON generado por Rhubarb Lip Sync contiene información sobre el análisis del audio y las posiciones de la boca requeridas para la animación.

El script necesario para generar un archivo json es el siguiente

 ./Rhubarb-Lip-Sync-1.13.0-macOS/rhubarb -f json ./public/audios/context.wav  -o ./public/audios/context.json

Por el momento, se debe de instalar localmente la ultima versión del repositorio de la libreria y correr el script rhubarb para porder utilizar el script anterior.

Estructura del JSON

{
"metadata": {
"soundFile": "/Users/Kev/aprendizaje/react/r3f-vite-starter/./public/audios/introduction.wav",
"duration": 5.01
},
"mouthCues": [
{ "start": 0.00, "end": 0.13, "value": "X" },
{ "start": 0.13, "end": 0.19, "value": "C" },
{ "start": 0.19, "end": 0.32, "value": "E" }
]
}

Explicación de los campos

metadata

  • soundFile: Ruta del archivo de audio analizado.
  • duration: Duración total del audio en segundos.

mouthCues

Lista de objetos que representan los movimientos de la boca en función del tiempo.

Cada objeto tiene los siguientes campos:

  • start: Tiempo en segundos donde comienza el fonema.
  • end: Tiempo en segundos donde termina el fonema.
  • value: Representación de la forma de la boca asociada al fonema.

Significado del campo value

El campo value define las posiciones de la boca necesarias para representar los sonidos del habla. Estos valores corresponden a los fonemas detectados y pueden ser utilizados para animar un modelo 3D o 2D de forma realista.

Valores comunes y sus significados:

  • A: Boca abierta (ejemplo: "ah")
  • B: Boca cerrada (ejemplo: "m", "b", "p")
  • C: Sonidos dentales (ejemplo: "s", "z")
  • D: Sonidos labiodentales (ejemplo: "f", "v")
  • E: Boca semiabierta (ejemplo: "e")
  • F: Boca estirada (ejemplo: "ee")
  • X: Boca en reposo

Implementación en Código

El siguiente fragmento de código en Three.js Fiber muestra cómo se utilizan los valores mouthCues para modificar las influencias de los Blend Shapes en un modelo 3D en tiempo real:

useFrame(() => {
const currentAudioTime = audio.currentTime;

Object.values(corresponding).forEach((value) => {
nodes.Wolf3D_Head.morphTargetInfluences[
nodes.Wolf3D_Head.morphTargetDictionary[value]
] = 0;
nodes.Wolf3D_Teeth.morphTargetInfluences[
nodes.Wolf3D_Head.morphTargetDictionary[value]
] = 0;
});

for (let i = 0; i < lipsync.mouthCues.length; i++) {
const mouthCue = lipsync.mouthCues[i];
if (
currentAudioTime >= mouthCue.start &&
currentAudioTime <= mouthCue.end
) {
nodes.Wolf3D_Head.morphTargetInfluences[
nodes.Wolf3D_Head.morphTargetDictionary[corresponding[mouthCue.value]]
] = 1;
nodes.Wolf3D_Teeth.morphTargetInfluences[
nodes.Wolf3D_Head.morphTargetDictionary[corresponding[mouthCue.value]]
] = 0;
}
}
});

Conclusión

Rhubarb Lip Sync es una herramienta efectiva para la generación automática de sincronización labial en proyectos de animación. Su salida en formato JSON permite integrar fácilmente los datos en motores de animación como Three.js Fiber, facilitando la implementación de lip sync en personajes 3D y 2D.